|
ブロック(Blocks)はアップル社によるC言語、Objective-C、C++用の非標準の拡張であり、ラムダ式風の構文を用いてクロージャを作成する機能を提供する。ブロックはMac OS X 10.6以降とiOS 4.0以降向けのプログラムでサポートされるが、サードパーティ製ランタイムでMac OS X 10.5及びiOS 2.2以降でも使用可能である。〔https://code.google.com/p/plblocks/〕 ブロックは、Grand Central Dispatchスレッディングアーキテクチャーをより容易に記述できるようにするという明確な目的でアップルによって設計された〔Apple Technical Brief on Grand Central Dispatch , retrieved on June 9, 2009.〕〔Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks 〕一方で、そのアーキテクチャーから独立して他のプログラミング言語のクロージャに類似した方法で使用することもできる。アップルはブロックをGNUコンパイラコレクションの自社のブランチと〔https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html〕Clang LLVMコンパイラフロントエンドに実装している。ブロックの言語ランタイムライブラリサポートはLLVMプロジェクトの一部で利用可能である。クロノスグループはブロック構文をOpenCLのバージョン2.0よりエンキューカーネルに使用している。〔http://www.khronos.org/registry/cl/specs/opencl-2.0-openclc.pdf#page=173〕 関数定義のように、ブロックは引数を持ち、内部でローカル変数を宣言することができる。一方で通常の関数定義とは違い、値は周囲のコンテキストから状況をとることもできる。ブロック定義はブロック内のコードへの参照及びその定義時のローカルのスタック変数の現在のスナップショットが含まれる不透明な値を生成する。ブロックは関数ポインタと同様に呼び出すことができる。 ブロックは変数に割り当てられたり、関数を越えたり、通常の関数ポインタのように使われるが、ブロックの範囲外で定義されたものを使用する際は特殊な演算子(Block_copy)でマークする必要がある。 ブロック値を与えると、ブロック内のコードは関数を呼び出す際と同じ構文を使用して、任意の時点で実行することができる。 == 例 == 周囲のスコープに可変のステートを取り出す簡単な例として、整数範囲イテレータがあげられる。〔: 〕 スポンサード リンク
|